package cn.digiwin.wx.utils;

import cn.digiwin.wx.model.TokenModel;
import cn.digiwin.wx.qyh.common.WeixinComm;
import com.alibaba.fastjson.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.IOException;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;


/**
 * 微信token的获取通用类
 * <p>
 * create by wenchuan.li on 2018/4/8.
 */
public class TokenUtil {

    protected static Logger log = LoggerFactory.getLogger(TokenUtil.class);

    private static TokenModel model = new TokenModel();

    /**
     * 获取企业token。
     * <pre>
     * 1.如果没有初始化则直接从数据库中获取。
     * 2.如果已经初始化。
     * 	1.如果已经过期则重新获取。
     * 	2.从缓存中获取。
     * </pre>
     *
     * @return
     */
    public static synchronized String getWxToken() {
        //没有初始化直接获取。
        if (!model.isInit()) {
            String token = getToken();
            return token;
        } else {
            //如果token要过期则重新获取。
            if (model.isExpire()) {
                String token = getToken();
                return token;
            } else {
                //从缓存中获取。
                return model.getToken();
            }
        }
    }

    /**
     * 获取token。
     *
     * @return
     */
    private static String getToken() {
        String url = WeixinComm.getWxToken();
        String rtn = "";
        JSONObject result;
        try {
            rtn = HttpUtil.sendHttpsRequest(url, "", WeixinComm.METHOD_GET);
            result = JSONObject.parseObject(rtn);

            if (rtn.indexOf("errcode") != -1) { //升级企业微信后
                String token = result.getString("access_token");
                int expireIn = result.getInteger("expires_in");
                model.setToken(token, expireIn);
                return token;
            }
            //获取失败
            else {
                log.error(result.getString("errmsg"));
                return "-1";
            }
        } catch (KeyManagementException | NoSuchAlgorithmException
                | NoSuchProviderException | IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "-1";
    }


}
